home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 142 / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan).7z / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan) (Track 1).bin / tools / s44play / s44p101s.lzh / opmset.s < prev    next >
Text File  |  1999-12-19  |  6KB  |  182 lines

  1.     .include    iocscall.mac
  2.     .include    global.mac
  3.  
  4. ;----------------------------------------------------------------
  5. opmset    .macro    src,dst
  6.     move.b    dst,d1
  7.     move.b    src,d2
  8.     IOCS    _OPMSET
  9.     .endm
  10.  
  11. opmall    .macro    src,dst
  12.     move.b    src,d3
  13.     move.b    dst,d4
  14.     bsr    opm8
  15.     .endm
  16.  
  17. ;----------------------------------------------------------------
  18. ;FM音源の初期化
  19.     .text
  20.     .align    4,$2048
  21. init_opm::
  22.     movem.l    d1-d6,-(sp)
  23.  
  24. ;再生モードに関わらず全チャンネルをKEY OFFしておく
  25.     opmset    #%0_0_0_0_0_000,#$08    ;C2=0,M2=0,C1=0,M1=0(CH1)
  26.     opmset    #%0_0_0_0_0_001,#$08    ;C2=0,M2=0,C1=0,M1=0(CH2)
  27.     opmset    #%0_0_0_0_0_010,#$08    ;C2=0,M2=0,C1=0,M1=0(CH3)
  28.     opmset    #%0_0_0_0_0_011,#$08    ;C2=0,M2=0,C1=0,M1=0(CH4)
  29.     opmset    #%0_0_0_0_0_100,#$08    ;C2=0,M2=0,C1=0,M1=0(CH5)
  30.     opmset    #%0_0_0_0_0_101,#$08    ;C2=0,M2=0,C1=0,M1=0(CH6)
  31.     opmset    #%0_0_0_0_0_110,#$08    ;C2=0,M2=0,C1=0,M1=0(CH7)
  32.     opmset    #%0_0_0_0_0_111,#$08    ;C2=0,M2=0,C1=0,M1=0(CH8)
  33.  
  34. ;全レジスタクリア
  35.     moveq.l    #0,d4
  36.     move.w    #256-1,d5
  37. @@:    opmset    #0,d4
  38.     addq.b    #1,d4
  39.     dbra    d5,@b
  40.  
  41.   .if WAVE_FORM=0
  42.     tst.b    mono_play_flag
  43.     beq    1f
  44.     opmset    #%1_1_111_010,#$20    ;(CH1)R=1,L=1,FL=7,CON=2
  45.     opmset    #%1_1_111_010,#$21    ;(CH2)R=1,L=1,FL=7,CON=2
  46.     opmset    #%1_1_111_010,#$22    ;(CH3)R=1,L=1,FL=7,CON=2
  47.     opmset    #%1_1_111_010,#$23    ;(CH4)R=1,L=1,FL=7,CON=2
  48.     bra    2f
  49. 1:    opmset    #%0_1_111_010,#$20    ;(CH1)R=0,L=1,FL=7,CON=2
  50.     opmset    #%0_1_111_010,#$21    ;(CH2)R=0,L=1,FL=7,CON=2
  51.     opmset    #%0_1_111_010,#$22    ;(CH3)R=0,L=1,FL=7,CON=2
  52.     opmset    #%0_1_111_010,#$23    ;(CH4)R=0,L=1,FL=7,CON=2
  53.     opmset    #%1_0_111_010,#$24    ;(CH5)R=1,L=0,FL=7,CON=2
  54.     opmset    #%1_0_111_010,#$25    ;(CH6)R=1,L=0,FL=7,CON=2
  55.     opmset    #%1_0_111_010,#$26    ;(CH7)R=1,L=0,FL=7,CON=2
  56.     opmset    #%1_0_111_010,#$27    ;(CH8)R=1,L=0,FL=7,CON=2
  57. 2:
  58.   .else    ;WAVE_FORM=1,2
  59.     tst.b    mono_play_flag
  60.     beq    1f
  61.     opmset    #%1_1_000_000,#$20    ;(CH1)R=1,L=1,FL=0,CON=0
  62.     opmset    #%1_1_000_000,#$21    ;(CH2)R=1,L=1,FL=0,CON=0
  63.     opmset    #%1_1_000_000,#$22    ;(CH3)R=1,L=1,FL=0,CON=0
  64.     opmset    #%1_1_000_000,#$23    ;(CH4)R=1,L=1,FL=0,CON=0
  65.     bra    2f
  66. 1:    opmset    #%0_1_000_000,#$20    ;(CH1)R=0,L=1,FL=0,CON=0
  67.     opmset    #%0_1_000_000,#$21    ;(CH2)R=0,L=1,FL=0,CON=0
  68.     opmset    #%0_1_000_000,#$22    ;(CH3)R=0,L=1,FL=0,CON=0
  69.     opmset    #%0_1_000_000,#$23    ;(CH4)R=0,L=1,FL=0,CON=0
  70.     opmset    #%1_0_000_000,#$24    ;(CH5)R=1,L=0,FL=0,CON=0
  71.     opmset    #%1_0_000_000,#$25    ;(CH6)R=1,L=0,FL=0,CON=0
  72.     opmset    #%1_0_000_000,#$26    ;(CH7)R=1,L=0,FL=0,CON=0
  73.     opmset    #%1_0_000_000,#$27    ;(CH8)R=1,L=0,FL=0,CON=0
  74. 2:
  75.   .endif
  76.  
  77.     opmall    #%0_000_0000,#$28    ;OCT=0,NOTE=0
  78.     opmall    #%000000_00,#$30    ;KF=0
  79.     opmall    #%0_000_00_00,#$38    ;PMS=0,AMS=0
  80.  
  81. ;DT1=ディチューン1 周波数の微妙なずれ
  82. ;MUL=倍率 周波数の倍率 0=0.5倍
  83. ;TL=トータルレベル 全体の減衰量→音量を表す 127=最大減衰量(無音)
  84. ;AR=アタックレート keyonからアタックまでの増加速度 31=最大速度
  85. ;D1R=ファストディケイレート アタックからディケイレベルまでの減衰速度 31=最大速度
  86. ;DT2=ディチューン2 周波数の大きなずれ
  87. ;D2R=セカンドディケイレート ディケイレベルからkeyoffまでの減衰速度 31=最大速度
  88. ;D1L=ディケイレベル D1Rの減衰速度でD1Lの減衰量に達するとD2Rに移行する 15=最大減衰量
  89. ;RR=リリースレート keyoff後の減衰 15=最大速度
  90.   .if WAVE_FORM=0
  91.     opmall    #%0_000_0001,#$40    ;(M1)DT1=0,MUL=1
  92.     opmall    #%0_000_0001,#$50    ;(C1)DT1=0,MUL=1
  93.     opmall    #%0_000_0001,#$48    ;(M2)DT1=0,MUL=1
  94.     opmall    #%0_000_0000,#$58    ;(C2)DT1=0,MUL=0
  95.     opmall    #%0_0101101,#$60    ;(M1)TL=41
  96.     opmall    #%0_0100100,#$70    ;(C1)TL=60
  97.     opmall    #%0_0100010,#$68    ;(M2)TL=70
  98.     opmall    #%0_1111111,#$78    ;(C2)TL=127
  99.   .else    ;WAVE_FORM=1,2
  100.     opmall    #%0_000_0001,#$40    ;(M1)DT1=0,MUL=1
  101.     opmall    #%0_000_0001,#$50    ;(C1)DT1=0,MUL=1
  102.     opmall    #%0_000_0001,#$48    ;(M2)DT1=0,MUL=1
  103.     opmall    #%0_000_0000,#$58    ;(C2)DT1=0,MUL=0
  104.     .if WAVE_FORM=1
  105.     opmall    #%0_0101101,#$60    ;(M1)TL=45
  106.     opmall    #%0_0100100,#$70    ;(C1)TL=36
  107.     opmall    #%0_0100010,#$68    ;(M2)TL=34
  108.     opmall    #%0_1111111,#$78    ;(C2)TL=127
  109.     .else    ;WAVE_FORM=2
  110.     opmall    #%0_0101111,#$60    ;(M1)TL=47
  111.     opmall    #%0_0100110,#$70    ;(C1)TL=38
  112.     opmall    #%0_0100011,#$68    ;(M2)TL=35
  113.     opmall    #%0_1111111,#$78    ;(C2)TL=127
  114.     .endif
  115.   .endif
  116.  
  117.     moveq.l    #%11_0_00000,d6        ;KS=3
  118.     or.b    fadein_speed,d6        ;AR=0~31
  119.  
  120.     opmall    d6,#$80            ;(M1)KS=3,AR=31
  121.     opmall    #%0_00_00000,#$A0    ;(M1)AMS=0,D1R=0
  122.     opmall    #%00_0_00000,#$C0    ;(M1)DT2=0,D2R=0
  123.     opmall    #%0000_1111,#$E0    ;(M1)D1L=0,RR=15
  124.  
  125.     opmall    d6,#$90            ;(C1)KS=3,AR=31
  126.     opmall    #%0_00_00000,#$B0    ;(C1)AMS=0,D1R=0
  127.     opmall    #%00_0_00000,#$D0    ;(C1)DT2=0,D2R=0
  128.     opmall    #%0000_1111,#$F0    ;(C1)D1L=0,RR=15
  129.  
  130.     opmall    d6,#$88            ;(M2)KS=3,AR=31
  131.     opmall    #%0_00_00000,#$A8    ;(M2)AMS=0,D1R=0
  132.     opmall    #%00_0_00000,#$C8    ;(M2)DT2=0,D2R=0
  133.     opmall    #%0000_1111,#$E8    ;(M2)D1L=0,RR=15
  134.  
  135.     opmall    d6,#$98            ;(C2)KS=3,AR=31
  136.     opmall    #%0_00_00000,#$B8    ;(C2)AMS=0,D1R=0
  137.     opmall    #%00_0_00000,#$D8    ;(C2)DT2=0,D2R=0
  138.                     ;  C2のD2Rを増やすことでフェードアウトできる
  139.     opmall    #%0000_1111,#$F8    ;(C2)D1L=0,RR=15
  140.  
  141.     opmset    #%00000000,#$18        ;LFRQ=0
  142.     opmset    #%10000000,#$19        ;PMD=0
  143.     opmset    #%00000000,#$19        ;AMD=0
  144.     opmset    #%0_0_0000_01,#$1B    ;CT2=0,CT1=0,W=1
  145.  
  146.     movem.l    (sp)+,d1-d6
  147.     rts
  148.  
  149. opm8:
  150.     moveq.l    #4-1,d5
  151.     tst.b    mono_play_flag
  152.     bne    @f
  153.     moveq.l    #8-1,d5
  154. @@:
  155. @@:    opmset    d3,d4
  156.     addq.b    #1,d4
  157.     dbra    d5,@b
  158.     rts
  159.  
  160. ;----------------------------------------------------------------
  161. ;FM音源の後始末
  162.     .text
  163.     .align    4,$2048
  164. tini_opm::
  165.     movem.l    d1-d2,-(sp)
  166.  
  167.     opmset    #%0_0_0_0_0_000,#$08    ;C2=0,M2=0,C1=0,M1=0(CH1)
  168.     opmset    #%0_0_0_0_0_001,#$08    ;C2=0,M2=0,C1=0,M1=0(CH2)
  169.     opmset    #%0_0_0_0_0_010,#$08    ;C2=0,M2=0,C1=0,M1=0(CH3)
  170.     opmset    #%0_0_0_0_0_011,#$08    ;C2=0,M2=0,C1=0,M1=0(CH4)
  171.     tst.b    mono_play_flag
  172.     bne    @f
  173.     opmset    #%0_0_0_0_0_100,#$08    ;C2=0,M2=0,C1=0,M1=0(CH5)
  174.     opmset    #%0_0_0_0_0_101,#$08    ;C2=0,M2=0,C1=0,M1=0(CH6)
  175.     opmset    #%0_0_0_0_0_110,#$08    ;C2=0,M2=0,C1=0,M1=0(CH7)
  176.     opmset    #%0_0_0_0_0_111,#$08    ;C2=0,M2=0,C1=0,M1=0(CH8)
  177. @@:
  178.  
  179.     movem.l    (sp)+,d1-d2
  180.     rts
  181.  
  182.